package shared

import (
	"GopherFocus/app/model"
	"context"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

// 上下文管理服务
var Context = contextShared{}

type contextShared struct{}

// 初始化自定义的上下文对象指针到请求上下文对象中，以便后续的请求流程中可以修改
func (s *contextShared) Init(r *ghttp.Request, customCtx *model.Context) {
	// SetCtxVar设置上下文变量，这里设置的是key -> 自定义上下文对象的映射
	r.SetCtxVar(model.ContextKey, customCtx)
}

// 获取自定义上下文对象，如果没有设置则返回nil
func (s *contextShared) Get(ctx context.Context) *model.Context {
	value := ctx.Value(model.ContextKey)
	if value == nil {
		return nil
	}
	// 将interface类型转换为*model.Context类型
	if localCtx, ok := value.(*model.Context); ok {
		return localCtx
	}
	return nil
}

// 将用户信息添加到自定义上下文对象中(customCtx{User Session Data})
func (s *contextShared) SetUser(ctx context.Context, ctxUser *model.ContextUser) {
	s.Get(ctx).User = ctxUser
}

// 将上下文信息设置到上下文请求中，注意是完整覆盖
func (s *contextShared) SetData(ctx context.Context, data g.Map) {
	s.Get(ctx).Data = data
}
